home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / objects in c ƒ / OIC Sources / Linkseq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-05  |  1.7 KB  |  88 lines  |  [TEXT/KAHL]

  1. /*
  2.  *        Sequence abstract class for Linked objects
  3.  *
  4.  *            Copyright © John Wainwright 1988
  5.  *
  6.  *    Superclasses:
  7.  *
  8.  *    Purpose:
  9.  *        To provide a class which will wrap-up a linked object (one that
  10.  *        responds to head, tail, etc) and provide the general sequencing
  11.  *        operations over it.
  12.  *
  13.  *    methods:
  14.  *        start ls l        -    initialises a new sequence object
  15.  *        next ls         -    get next element in the linked object, or END.
  16.  *        moreInSeq ls    -    return true if the seq is not exhausted
  17.  *        restart ls        -    restarts the sequence
  18.  */
  19.  
  20. #include "oic.h"
  21. #include "generics.h"
  22.  
  23. class      Linkseq;
  24.  
  25. struct seq_i
  26. {
  27.     object    ls_source;        /* the original source object             */
  28.     object    ls_rest;        /* current tail of source                 */
  29. };
  30. typedef struct seq_i seq_i;
  31.  
  32. /* ------------------------- Instance methods ---------------------------- */
  33.  
  34. method object
  35. _start(self, seq, source)
  36.     object            self;
  37.     register seq_i    *seq;
  38.     register object    *source;
  39. {
  40.     seq->ls_source = seq->ls_rest = *source;
  41.     return self;
  42. }
  43.  
  44. method object
  45. _next(self, seq)
  46.     object            self;
  47.     register seq_i    *seq;
  48. {
  49.     register object    item;
  50.  
  51.     item = head(seq->ls_rest);
  52.     seq->ls_rest = tail(seq->ls_rest);
  53.     if (item == END)
  54.         dispose(self);
  55.     return item;
  56. }
  57.  
  58. method int
  59. _moreInSeq(self, seq)
  60.     object            self;
  61.     register seq_i    *seq;
  62. {
  63.     return ! (int)isEmpty(seq->ls_rest);
  64. }
  65.  
  66. method object
  67. _restart(self, seq)
  68.     object            self;
  69.     register seq_i    *seq;
  70. {
  71.     seq->ls_rest = seq->ls_source;
  72.     return self;
  73. }
  74.  
  75. /* ------------------- Init the Linkseq class ------------------------------- */
  76.  
  77. InitLinkseq()
  78. {
  79.     Linkseq = NewClass(sizeof(seq_i), 0, "Linkseq", END);
  80.     AddMethods(Linkseq,
  81.         startGeneric,         _start,
  82.         nextGeneric,          _next,
  83.         moreInSeqGeneric,     _moreInSeq,
  84.         restartGeneric,       _restart,
  85.         END);
  86. }
  87.  
  88.